package payment

import (
	"context"
	"fmt"

	"oil-station-backend/internal/service"
	"oil-station-backend/internal/svc"
	"oil-station-backend/internal/types"
	"oil-station-backend/internal/utils"

	"github.com/zeromicro/go-zero/core/logx"
)

type WechatPayLogic struct {
	logx.Logger
	ctx    context.Context
	svcCtx *svc.ServiceContext
}

func NewWechatPayLogic(ctx context.Context, svcCtx *svc.ServiceContext) *WechatPayLogic {
	return &WechatPayLogic{
		Logger: logx.WithContext(ctx),
		ctx:    ctx,
		svcCtx: svcCtx,
	}
}

func (l *WechatPayLogic) CreatePayment(req *types.WechatPayReq) (resp *types.WechatPayResp, err error) {
	// 从上下文中获取用户信息
	userId, _, err := utils.GetUserInfoFromContext(l.ctx)
	if err != nil {
		return nil, err
	}

	// 获取用户信息
	user, err := l.svcCtx.UserModel.FindById(userId)
	if err != nil {
		return nil, fmt.Errorf("用户不存在")
	}

	// 检查订单是否存在且属于当前用户
	order, err := l.svcCtx.OrderModel.FindById(req.OrderId)
	if err != nil {
		return nil, fmt.Errorf("订单不存在")
	}

	if order.UserId != userId {
		return nil, fmt.Errorf("无权操作此订单")
	}

	if order.Status != "pending" {
		return nil, fmt.Errorf("订单状态不允许支付")
	}

	// 初始化微信服务
	wechatService := service.NewWechatService()

	// 创建微信支付订单
	payResp, err := wechatService.CreatePayment(req, user.OpenId)
	if err != nil {
		l.Errorf("创建微信支付订单失败: %v", err)
		return nil, fmt.Errorf("创建支付订单失败")
	}

	l.Infof("微信支付订单创建成功，订单ID: %d, 用户ID: %d", req.OrderId, userId)

	return payResp, nil
}

func (l *WechatPayLogic) HandlePaymentNotify(req *types.PaymentNotifyReq) error {
	l.Infof("收到微信支付回调通知: %+v", req)

	// 这里应该验证回调签名，确保是微信发送的
	// 实际项目中需要完整实现

	// 根据out_trade_no查找订单并更新状态
	// 这里简化处理，实际需要解析订单号获取订单ID

	l.Infof("支付回调处理完成")
	return nil
}